<?php
   $pub_file = 'zmxy_offline_public_key.pem';
   $private_file = 'zmxy_offline_private_key.pem';

    //------------------------------------------------------------------------------------------
    //公钥加密
    $public_content=file_get_contents($pub_file);
    $public_key=openssl_get_publickey($public_content);

    $original_str = '待加密的内容';
    $original_arr=str_split($original_str,117); //折分
    foreach($original_arr as $o)
    {
        $sub_enc=null;
        openssl_public_encrypt($o,$sub_enc,$public_key);
        $original_enc_arr[]=$sub_enc;
    }
    
    openssl_free_key($public_key);
    $original_enc_str=base64_encode(implode('',$original_enc_arr));//最终网络传的密文
    echo 'encrtyp:' . $original_enc_str . '<br/>';
    
    //私钥解密
    $private_content=file_get_contents($private_file);
    $private_key=openssl_get_privatekey($private_content);
 
    $original_enc_str=base64_decode($original_enc_str);
    // openssl_private_decrypt($original_enc_str,$orig_dec_str,$private_key);
    // echo 'decrypt: ' . $orig_dec_str . '<br/>';
    $orig_dec_str='';
    for($i=0;$i<strlen($original_enc_str)/128;$i++)
    {
        $data=substr($original_enc_str,$i*128,128);
        openssl_private_decrypt($data,$decrypt,$private_key);
        $orig_dec_str.=$decrypt;
    }
    echo 'decrypt: ' . $orig_dec_str . '<br/><br/>';
        //$orig_dec_str为最后解密出来的。


    //------------------------------------------------------------------------------------------
    //私钥加密
    //注：私钥加密及公钥解密同理。
    $private_key=openssl_get_privatekey($private_content);

    $original_str = '待加密的内容';
    $original_arr=str_split($original_str,117); //折分
    $private_content=file_get_contents($private_file);
    
    $original_enc_arr = [];
    foreach($original_arr as $o)
    {
        $sub_enc=null;
        openssl_private_encrypt($o,$sub_enc,$private_key);
        $original_enc_arr[]=$sub_enc;
    }
    
    openssl_free_key($private_key);
    $original_enc_str=base64_encode(implode('',$original_enc_arr));//最终网络传的密文
    echo 'encrtyp:' . $original_enc_str . '<br/>';
    
    //公钥解密
    $public_content=file_get_contents($pub_file);
    $public_key=openssl_get_publickey($public_content);

    $original_enc_str=base64_decode($original_enc_str);
    $orig_dec_str='';
    for($i=0;$i<strlen($original_enc_str)/128;$i++)
    {
        $data=substr($original_enc_str,$i*128,128);
        openssl_public_decrypt($data,$decrypt,$public_key);
        $orig_dec_str.=$decrypt;
    }
    echo 'decrypt: ' . $orig_dec_str . '<br/>';  //$orig_dec_str为最后解密出来的。
       


    //------------------------------------------------------------------------------------------
    //私钥签名
    $private_content=file_get_contents($private_file);
    $private_key=openssl_get_privatekey($private_content);

    $original_str='待加密的内容';   //原数据
    openssl_sign($original_str,$sign,$private_key);
    openssl_free_key($private_key);
    echo 'sign: ' . $sign  . '<br/>raw: ' . $original_str . '<br/>';
    $sign=base64_encode($sign);//最终的签名
    

    //公钥验签
    $public_content=file_get_contents($pub_file);
    $public_key=openssl_get_publickey($public_content);

    $sign=base64_decode($sign);//得到的签名
    //$original_str=''; //得到的数据
    $result=(bool)openssl_verify($original_str,$sign,$public_key);
    openssl_free_key($public_key);
    echo 'sign: ';
    var_dump($result);
    echo '<br/>';
    //$result为真时签验通过,假时未通过
